#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
const int INF=0x3f3f3f3f;
int n,m,s,k;
int t[N],dis[N][105];
int u,v;
int cnt;
int head[N];
struct Edge{
    int v,next;
}edge[2*N];
void init(){
    cnt=0;
    memset(head,-1,sizeof(head));
    memset(dis,INF,sizeof(dis));
    for(int i=1;i<=n;i++){
        dis[i][t[i]]=0;
    }
}
void addEdge(int u,int v){
    edge[cnt]=Edge{v,head[u]};
    head[u]=cnt++;
    edge[cnt]=Edge{u,head[v]};
    head[v]=cnt++;
}
vector<int> tt[105];
struct node{
    int i,dis;
};
bool vis[N];
void bfs(){
    queue<node> q;
    for(int i=1;i<=k;i++){
        while(!q.empty()){
            q.pop();
        }
        memset(vis,false,sizeof(vis));
        for(int j=0;j<tt[i].size();j++){
            q.push(node{tt[i][j],0});
            vis[tt[i][j]]=true;
        }
        while(!q.empty()){
            node tmp=q.front();
            //printf("%d\n",tmp.i);
            q.pop();
            int u=tmp.i;
            for(int j=head[u];j!=-1;j=edge[j].next){
                int v=edge[j].v;
                if(vis[v]){
                    continue;
                }
                vis[v]=true;
                dis[v][i]=min(dis[v][i],tmp.dis+1);
                q.push(node{v,tmp.dis+1});
            }
        }
        //printf("------------\n");
        // for(int j=1;j<=n;j++){
        //     printf("%d ",dis[j][i]);
        // }
        // printf("\n");
    }
    // for(int i=1;i<=n;i++){
    //     for(int j=1;j<=k;j++){
    //         printf("%d ",dis[i][j]);
    //     }
    //     printf("\n");
    // }
}
vector<int> res;
int main(void){
    scanf("%d%d%d%d",&n,&m,&k,&s);
    for(int i=1;i<=n;i++){
        scanf("%d",&t[i]);
        tt[t[i]].push_back(i);
    }
    init();
    for(int i=0;i<m;i++){
        scanf("%d%d",&u,&v);
        addEdge(u,v);
    }
    bfs();
    for(int i=1;i<=n;i++){
        sort(dis[i]+1,dis[i]+k+1);
        int ans=0;
        for(int j=1;j<=s;j++){
            ans+=dis[i][j];
        }
        res.push_back(ans);
    }
    printf("%d",res[0]);
    for(int i=1;i<n;i++){
        printf(" %d",res[i]);
    }
    printf("\n");
    return 0;
}